package com.scut.scutzone.exception;

import com.scut.scutzone.vo.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletResponse;

/**
 * @author: lifeng Chan
 * @date: 2021/4/28 15:07
 * @description:
 * 定义全局错误处理器
 * 目前只定义了一种错误类型BusinessException, 每个错误类型由一个方法处理
 */


@ControllerAdvice
public class GlobalDefaultExceptionHandler {

    /*
    下面这段内容是备忘
    每个Logger都被了一个日志级别（log level），用来控制日志信息的输出。日志级别从高到低分为：
    A：off         最高等级，用于关闭所有日志记录。
    B：fatal       指出每个严重的错误事件将会导致应用程序的退出。
    C：error      指出虽然发生错误事件，但仍然不影响系统的继续运行。
    D：warm     表明会出现潜在的错误情形。
    E：info         一般和在粗粒度级别上，强调应用程序的运行全程。
    F：debug     一般用于细粒度级别上，对调试应用程序非常有帮助。
    G：all           最低等级，用于打开所有日志记录。
     */
    private final static Logger logger=LoggerFactory.getLogger(GlobalDefaultExceptionHandler.class);

    @ExceptionHandler(BusinessException.class)
    @org.springframework.web.bind.annotation.ResponseBody
    public Result businessErrorHandler(BusinessException e, HttpServletResponse response){

        //日志记录，根据开发环境不同选择日志的级别
        logger.debug(e.getMessage());
        //

        response.setStatus(e.code());
        return Result.error(e);
    }

    //系统异常不响应到前端，仅供开发参考
    @ExceptionHandler(Exception.class)
    public void systemErrorHandler(Exception e){
        logger.error(e.getMessage(),e);
    }
}
